package com.zhouyu.commonapi.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * Description:
 * 工具类
 * @author zhouyu
 * @date 2022/2/17 10:05
 */
public class MyBeanUtil extends BeanUtils {
    private static final Logger logger = LoggerFactory.getLogger(MyBeanUtil.class);
    /**
     * description: 将数据来源转化为目标数据并使用函数处理目标数据
     * @param source 来源数据
     * @param target 目标数据
     * @param handleTarget 目标数据处理函数
     * @return: T
     * @Author: zhouyu
     * @Date: 2022/2/17 11:35
     */
    public static<S,T> void copyProperties(S source, T target, Consumer<T> handleTarget){
        copyProperties(source,target);
        handleTarget.accept(target);
    }

    /**
     * description:数据来源集合转化为目标数据集合
     * @param sources 来源数据
     * @param targetClass 目标数据类型
     * @return: java.util.List<T> 目标数据集合
     * @Author: zhouyu
     * @Date: 2022/2/17 14:03
     */
    public static<S,T> List<T> copyProperties(List<S> sources,Class<T> targetClass){
        try {
            List<T> targetList = new ArrayList<>();
            for (S source : sources) {
                T target = targetClass.newInstance();
                copyProperties(source,target);
                targetList.add(target);
            }
            return targetList;
        } catch (Exception e) {
            logger.error("copyProperties error",e);
            return null;
        }
    }

    /**
     * description:数据来源集合转化为目标数据集合并使用函数处理每个目标数据
     * @param sources 来源数据
     * @param targetClass 目标数据类型
     * @return: java.util.List<T> 目标数据集合
     * @Author: zhouyu
     * @Date: 2022/2/17 14:03
     */
    public static<S,T> List<T> copyProperties(List<S> sources,Class<T> targetClass,Consumer<T> handleTarget){
        try {
            List<T> targetList = new ArrayList<>();
            for (S source : sources) {
                T target = targetClass.newInstance();
                copyProperties(source,target);
                handleTarget.accept(target);
                targetList.add(target);
            }
            return targetList;
        } catch (Exception e) {
            logger.error("copyProperties error",e);
            return null;
        }
    }
}
